package com.authority.utils;

import com.authority.entity.Permission;
import com.authority.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

/**
 * 菜单树工具类
 */
public class MenuTreeUtils {
    /**
     *
     * @param menuList 菜单列表
     * @param pid      父菜单ID
     * @return
     */
    public static List<RouterVo> makeRouter(List<Permission> menuList,Long pid){
        //创建路由保存路由信息
        List<RouterVo> routerVoList=new ArrayList<>();
        //判断当前菜单列表是否为空,如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList)
                .orElse(new ArrayList<Permission>())
                .stream()
                .filter(item->item!=null&& Objects.equals(item.getParentId(), pid))
                .forEach(item->{
                    RouterVo routerVo=new RouterVo();
                    routerVo.setName(item.getName());//路由名称
                    routerVo.setPath(item.getPath());//路由地址
                    //判断菜单是否是一级菜单
                    if(item.getParentId()==0L){
                         routerVo.setComponent("Layout");//一级菜单组件
                         routerVo.setAlwaysShow(true);  //显示路由
                    }else{
                         routerVo.setComponent(item.getUrl());//具体某一个组件
                         routerVo.setAlwaysShow(false);  //折叠路由
                    }
                    //设置Meta信息
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(),item.getIcon(),item.getCode().split(",")));
                    //递归生成路由
                    List<RouterVo> children = makeRouter(menuList, item.getId());
                    routerVo.setChildren(children);
                    //将路由信息添加到集合中
                    routerVoList.add(routerVo);
                });

        return routerVoList;
    }

    /**
     * 生成菜单树
     * @param menuList
     * @param pid
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList,Long pid){

        List<Permission> permissionList=new ArrayList<>();
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
                .stream().filter(item->item!=null&& Objects.equals(item.getParentId(), pid))
                .forEach(item->{
                    //创建权限菜单对象
                    Permission permission=new Permission();
                    //属性复制
                    BeanUtils.copyProperties(item,permission);//第一个是要被复制
                    //获取每一个item对象的子菜单，递归生成菜单树
                    List<Permission> children = makeMenuTree(menuList, item.getId());
                    permission.setChildren(children);
                    permissionList.add(permission);
                });
        return permissionList;
    }

}
